﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using SistemaCenterQuimPost.Control;  //usado para validar la grilla.
using SistemaCenterQuimPost.Reportes; //usado para imprimir la venta.
using SistemaCenterQuimPost.Plantillas; //necesario para obtener fecha, nombre usuario etc,


namespace SistemaCenterQuimPost.UI.PostCajero
{
    public partial class frmPresupuestos : SistemaCenterQuimPost.UI.PostCajero.frmRegistrarVentas
    {
        //---------ATRIBUTOS--------------------------
        
        private DataSet3 clientesDs;
        private DataSet3TableAdapters.ClientesTableAdapter clienteTa;
        private DataSet2TableAdapters.PostTableAdapter postTa;
        //---------CONSTRUCTORES----------------------
        public frmPresupuestos()
        {
            
            centerQuimDs = new DataSet2();
            clientesDs = new DataSet3();
            clienteTa = new DataSet3TableAdapters.ClientesTableAdapter();
            postTa = new DataSet2TableAdapters.PostTableAdapter();
            InitializeComponent();
        }
        //---------ESTADOS-----------------------------
        
        //redefinido del padre.
        protected override void estEsperandoOperacion() //se redefine para que no cause conflicto. Acá no se usa
        {
            if (refrescarResgProductos) //si hace falta actualizar el refrescarResgProducto se realiza
            {
                ejecutarHiloActualizarResgProductos();

            }

            System.Windows.Forms.Control[] controlesHabilitados = { txtCodBarra, btnBusCodigo, txtDescripcion, btnBusDescripcion, btnBuscarCliente, dgvVenta, txtDescuentos, btnProcesar };
            System.Windows.Forms.Control[] controlesDeshabilitados = { lstProductosCodBarra, lstProductosDescripcion};
            System.Windows.Forms.Control[] controlesVisibles = { lblF2, lblF5 };
            System.Windows.Forms.Control[] controlesInvisibles = { lstProductosCodBarra, lstProductosDescripcion, lblError, lblF6 };

            habilitarControles(controlesHabilitados);
            deshabilitarControles(controlesDeshabilitados);
            visibleControles(controlesVisibles);
            invisibleControles(controlesInvisibles);

            errorProvider1.Clear();  //se borran los errores, si habian.

            txtCodBarra.Focus();   //se deja el foco en txtCodBarra

            estadoDelFormulario = "estEsperandoOperacion";
        }
        //-------------METODOS VARIOS-----------------
        protected override void removerControles()   //Eliminar los controles que heredé pero que no los voy a usar.
        {
            this.Controls.Remove(this.lblPrecioCosto);
            this.Controls.Remove(this.txtPrecioCosto);
            this.Controls.Remove(this.lblPrecioVenta);
            this.Controls.Remove(this.txtPrecioVenta);
            this.Controls.Remove(this.lblStockActual);
            this.Controls.Remove(this.txtStockActual);
            this.Controls.Remove(this.lblCantMinima);
            this.Controls.Remove(this.txtCantMinima);
            this.Controls.Remove(this.btnAgregar);
            this.Controls.Remove(this.btnEditar);
            this.Controls.Remove(this.lblEditar);
            this.Controls.Remove(this.lblAgregar);

            this.Controls.Remove(this.lblAgrPedido);
            this.Controls.Remove(this.txtCodPedido);
            this.Controls.Remove(this.btnBusPedido);
            this.Controls.Remove(this.btnNuevoPedido);
            this.Controls.Remove(this.btnImprimir);
            this.Controls.Remove(this.lblF4);
            this.Controls.Remove(this.lblAbono);
            this.Controls.Remove(this.txtAbono);
            this.Controls.Remove(this.txtVuelto);
            this.Controls.Remove(this.lblVuelto);
            this.Controls.Remove(this.lblObservacion);
            this.Controls.Remove(this.txtObservacion);
            this.Controls.Remove(this.lblFormaPago);
            this.Controls.Remove(this.cboFormaPago);


            this.Controls.Remove(this.lblErrorPCosto);
            this.Controls.Remove(this.lblErrorPVenta);
            this.Controls.Remove(this.lblErrorStockActual);
            this.Controls.Remove(this.lblErrorCantMin);

          
        }

        protected override void limpiarDatos()          //limpia la interface para iniciar un nuevo presupuesto
        {
            txtCodBarra.Text = "";
            txtDescripcion.Text = "";
            lblDniCliente.Text = "0";
            lblNombreCliente.Text = "CONSUMIDOR FINAL";
            dgvVenta.Rows.Clear();
            txtSubtotal.Text = "0";
            txtDescuentos.Text = "0";
            txtTotal.Text = "0";
                      
        }

        protected override void calcularSubTotalVenta()
        {
            Double subTotal = 0;

            this.validarGrilla(); //valida que la grilla donde existe selección, sea válida

            this.validarGrillaSinItems(); //valida que la grilla tenga fila o selecciones

            if (errorProvider1.GetError(dgvVenta) == "")  //si la grilla no tiene errores se procede a obtener el subtotal
            {
                foreach (DataGridViewRow row in dgvVenta.Rows)
                {
                    if ((bool)row.Cells[8].Value)
                    {
                        Double subtotalRow = 0; //subtotal de fila

                        subtotalRow = Convert.ToDouble(row.Cells[3].Value) * Convert.ToDouble(row.Cells[4].Value) + Convert.ToDouble(row.Cells[3].Value) * Convert.ToDouble(row.Cells[5].Value);  //precioUni*Cant + precioUni*Kg.Ltrs;
                        
                        row.Cells[7].Value = Math.Round(subtotalRow, 2);

                        subTotal += Convert.ToDouble(row.Cells[7].Value); //acumula el subtotal general.
                    }

                }

                txtSubtotal.Text = subTotal.ToString();

            }

        }

        protected override void txtSubtotal_TextChanged(object sender, EventArgs e) //captura el cambio de valor en txtSubtotal
        {
            calcularTotalVenta();   //si hay un cambio en el subtotal, ya sea porque se agrega, modifica o elimina una fila de productos
            

        }

        protected override void txtDescuentos_TextChanged(object sender, EventArgs e) //captura el cambio de valor en txtSubtotal
        {
            calcularTotalVenta();  //si hay un cambio en descuento, se debe recalcular el total de venta. (en este caso es presupuesto)
           
        }

        protected override void txtAbono_TextChanged(object sender, EventArgs e) //captura el cambio de valor en txtSubtotal
        {
            
        }

        //Redefinido del padre
        protected override void procesar() //se encapsulo en un método para usar cuando se presiona Enter con los textBox
        {
            if (formularioValido())
            {
                try
                {
                    DialogResult result = MessageBox.Show("¿Desea confirmar el nuevo presupuesto? ", "CONFIRMACION NUEVO PRESUPUESTO", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (result == DialogResult.Yes)
                    {
                        
                        quitarFilasNoSeleccionadas();

                        //Se muestra un mje de confirmación.
                        MessageBox.Show("Presupuesto ingresada con exito!!!", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        
                        imprimirPresupuesto();  //acá se llama para imprimir el presupuesto. Se debe ocupar la grilla.

                        limpiarDatos(); //se deja limpia la grilla para otro presupuesto.
                    
                    }
                }


                catch (IndexOutOfRangeException)
                {

                }
                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    //Si llega a ocurrir algún error en estado agregar 
                    this.Close();
                }

            }
            else
            {
                informarExistenciaError();
            }

        }


        protected override bool formularioValido()
        {
            validarGrilla();

            validarGrillaSinItems(); //valida que la grilla no se encuentre vacia o que contenga todos sus elementos sin seleccionar.

            validarDescuentos();

            

            if ((errorProvider1.GetError(dgvVenta) == "") & (errorProvider1.GetError(txtDescuentos) == ""))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        protected override void presionTeclaF1(object sender, KeyEventArgs e)  //captura evento KeyDown sobre el forms
        {

            if (e.KeyCode == Keys.F6)
            {
                if (estadoDelFormulario == "estEsperandoImpresion")
                {
                    this.limpiarDatos();
                    this.estEsperandoOperacion();
                }

            }
            else
            {
                if (e.KeyCode == Keys.F2)
                {
                    if (estadoDelFormulario == "estEsperandoOperacion")
                    {
                        this.txtCodBarra.Focus();
                        this.txtCodBarra.Select();
                    }

                }
                else
                {

                    if (e.KeyCode == Keys.F5)
                    {
                        if (estadoDelFormulario == "estEsperandoOperacion")
                        {
                            this.procesar();
                        }

                    }

                }
            }


        }

        private string obtenerFechaActual()  //Dato necesario para el alta de venta
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getFechaActual();
        }

        private void imprimirPresupuesto() //acá tenes que hacer la impresion de comprobante de presupustos.
        {
            //cargamos los  dataset`s
            centerQuimDs.ProductosxVenta .Rows .Clear ();
            centerQuimDs .Ventas .Rows .Clear ();

            centerQuimDs .Ventas .Rows .Add (1, obtenerFechaActual (),txtSubtotal .Text,txtTotal.Text,txtDescuentos .Text ,true,"M",0,"",0,0,"C" );
            int i = 1;
            foreach (DataGridViewRow row  in dgvVenta.Rows)
            {
                centerQuimDs.ProductosxVenta.Rows.Add(0,i,row .Cells [1].Value ,row.Cells [2].Value ,row.Cells [3].Value,row.Cells [4].Value,row.Cells [5].Value,row.Cells [7].Value,row.Cells [6].Value,0);
                i++;
            }

            clienteTa .FillByDni (clientesDs .Clientes ,lblDniCliente.Text );
            

            //Creamos una instancia de un objeto DataTable, y le hacemos que referencie a la tabla en CenterQuimDs.productoXventa
            DataTable unaDataTable = new DataTable();
            unaDataTable = centerQuimDs.ProductosxVenta;

            //creamos una instancia del tipo CrystalReports que habiamos creado y le asignamos a su crvVenta la tabla instanciada y parametros necesarios.
            crPresupuesto  unCrPresupuesto = new crPresupuesto ();
            unCrPresupuesto.SetDataSource(unaDataTable);

            //buscamos post
             postTa .Fill(centerQuimDs.Post);

           
            unCrPresupuesto.SetParameterValue("fechaValor", centerQuimDs.Ventas[0].fechaVenta.ToString("d"));
            unCrPresupuesto.SetParameterValue("subtotalValor", centerQuimDs.Ventas[0].subTotalVenta.ToString());
            unCrPresupuesto.SetParameterValue("descuentoValor", centerQuimDs.Ventas[0].importeDescuento.ToString());
            unCrPresupuesto.SetParameterValue("totalGeneralValor", centerQuimDs.Ventas[0].totalGeneral.ToString());
            unCrPresupuesto.SetParameterValue("postDireccion", centerQuimDs.Post[0].dirección.ToString());
            unCrPresupuesto.SetParameterValue("postTelefono", centerQuimDs.Post[0].telefono.ToString());

            if (lblDniCliente.Text == "0") //si no se indico el cliente
            {
                unCrPresupuesto.SetParameterValue("unNombre", "CONSUMIDOR FINAL");
                unCrPresupuesto.SetParameterValue("unaDireccion", " ");
            }
            else
            {
               unCrPresupuesto.SetParameterValue("unNombre", clientesDs.Clientes[0].apellidoyNombre.ToString());
                unCrPresupuesto.SetParameterValue("unaDireccion", clientesDs.Clientes[0].direccion.ToString() + ". " + clientesDs.Clientes[0].localidad.ToString());

            }

            //creamos una instancia del frmReporteVenta y le asignamos a su CrystalReportViewer el CrystalReports seteado
            frmPresupuesto  unFrmReportePresupuesto = new frmPresupuesto ();
            unFrmReportePresupuesto .crvPresupuesto . ReportSource = unCrPresupuesto ;

            //mostramos el frmReporteVenta
            unFrmReportePresupuesto.ShowDialog();


        }


        
    }
}
